const express = require('express')
const cors = require('cors')
// const { checkSchema } = require('express-validator');
const { body, validationResult, checkSchema } = require('express-validator');
var check = require('express-validator/check').check;
const Redis = require("ioredis");
const app = express()
const { v4 } = require('uuid')
console.log('uuidv4', v4())


const redis = new Redis({
    port: 3389, // Redis port
    // host: "redis://ZWQ257257@106.75.87.237:3389", // Redis host
    host: '106.75.33.58',
    username: "ubuntu", // needs Redis >= 6
    password: "ZWQ257257",
    db: 0, // Defaults to 0
});

app.use(cors())

app.use(express.json())

// const baseModel = {
//     createAt: {
//         type: Date,
//         default: Date.now
//     },
//     updateAt: {
//         type: Date,
//         default: Date.now
//     }
// }
// // /model/usersSchema.js 
// const usersSchema = new mongoose.Schema({
//     username: {
//         type: String,
//         reqired: true
//     },
//     email: {
//         type: String,
//         reqired: true
//     },
//     password: {
//         type: String,
//         reqired: true,
//         set: value => md5(value), // 保证进入数据库中的密码一定是密文形式的
//         select: false // 保证默认不查询这个字段， 需要这个字段时可以findOne({}).select('password)查询到
//     },
//     bio: {
//         type: String,
//         default: null
//     },
//     image: {
//         type: String,
//         default: null

//     },
//     ...baseModel
// });

// // 控制
// const userCtrl = {
// }

// 数据验证
const validate = validations => { // 2. 判断验证结果
    return async (req, res, next) => {
        await Promise.all(validations.map(validation => validation.run(req)));

        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            let list = []
            errors.array().map(item => list.push(item.msg))
            return res.json({
                code: 0,
                msg: list.join(';')
            });;
        }
        next()
    };
};
const bottleValidate = {
    // 打捞
    salvage: [
        validate([
            check('id').notEmpty().withMessage('id 不能为空'),
            check('type').notEmpty().withMessage('type 不能为空')
        ]),
        validate([
            // body('id').custom(async (id, { req }) => {
            //     // redis查询字段是否存在
            //     const user = await User.findOne({ id }).select(['id', 'username', 'bio', 'image', 'password'])
            //     console.log('findUser', user)
            //     if (!user) {
            //         return Promise.reject('用户名不存在')
            //     }
            //     req.user = user // 所有中间件共享req和res，所有讲数据挂载到请求对象req上
            // }),
            check('type').custom(async (type, { req }) => {
                if (!['all', 'male', 'female'].includes(type)) {
                    return Promise.reject('type值不对')
                }
            })

        ]),
    ],
    // 扔出
    throw: [
        validate([
            check('time').notEmpty().withMessage('time 不能为空'),
            check('owner').notEmpty().withMessage('owner 不能为空'),
            check('type').notEmpty().withMessage('type 不能为空'),
            check('content').notEmpty().withMessage('content 不能为空')
        ]),
        validate([
            check('time').custom(async (time, { req }) => {
                if (`${time}`.length !== 13) {
                    return Promise.reject('时间格式不对')
                }
            }),
            // check('owner').custom(async (time, { req }) => {
            //     // redis 查询键是否存在
            // }),
            check('type').custom(async (type, { req }) => {
                if (!['all', 'male', 'female'].includes(type)) {
                    return Promise.reject('type值不对')
                }
            })
        ])
    ]
}

let randomFn = (total) => {
    return Math.round(Math.random() * total + 1);  //得到一个在1~totals之间
}

// 打捞一个漂流瓶
app.get('/',
    // checkSchema({
    //     // id: {},
    //     type: {
    //         in: ['all', 'male', 'female'],
    //         errorMessage: 'type is wrong',
    //     }
    // }),
    bottleValidate.salvage,
    async function (req, res) {
        // 一： 获取参数
        console.log(req.query)
        // 二： 数据校验（见上面代码）
        // 三： 功能实现
        // console.log(randomFn(20))
        // let number= 
        let result = await redis.hgetall(req.query.id);
        // 四： 返回指定格式数据
        res.send({
            code: 1,
            msg: '打捞一个漂流瓶',
            ...result
        })
    })

// 扔出一个漂流瓶
app.post('/',
    bottleValidate.throw,
    async function (req, res) {
        // 一： 获取参数
        console.log(req.body)
        // 二： 数据校验 （见上面代码）
        // 三： 功能实现
        await redis.hmset(req.body.id, req.body);
        // 四： 返回指定格式数据
        // let body = {
        //     time: Date.now(),
        //     owner: '用户名',
        //     type: 'male',
        //     content: '内容',
        // }
        res.send({
            code: 1,
            msg: '扔出一个漂流瓶',
            // ...body
        })
    })

app.listen(3004)